package br.com.jvet.mb;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.event.ActionEvent;
import javax.faces.event.AjaxBehaviorEvent;
import javax.faces.model.SelectItem;

import org.primefaces.event.CloseEvent;

import br.com.jvet.constante.Especialidade;
import br.com.jvet.constante.EstadoCivil;
import br.com.jvet.constante.GrauEscolaridade;
import br.com.jvet.constante.Operacao;
import br.com.jvet.constante.Sexo;
import br.com.jvet.constante.Situacao;
import br.com.jvet.constante.TipoDeficiencia;
import br.com.jvet.constante.TipoFuncionario;
import br.com.jvet.constante.TipoTelefone;
import br.com.jvet.constante.UnidadeFederativa;
import br.com.jvet.entidade.Cargo;
import br.com.jvet.entidade.Funcionario;
import br.com.jvet.entidade.Telefone;
import br.com.jvet.infra.FuncionarioFacade;
import br.com.jvet.util.CommomUtils;
import br.com.jvet.util.FacesUtil;

@ManagedBean(name = "funcionarioDetalheMB")
@SessionScoped
public class FuncionarioDetalheMB implements Serializable {

	private FacesUtil FACES = new FacesUtil();
	private static final long serialVersionUID = 5455219615505544247L;
	private Funcionario funcionario;
	private Operacao operacao;
	private final String RETORNO_PAGINA = "/paginas/funcionario/cadastroFuncionario.jsf?faces-redirect=true";
	private Telefone telefone;
	@EJB
	private FuncionarioFacade funcionarioFacade;
	private List<Cargo> listaCargo;
	private boolean possuiMedico;

	public FuncionarioDetalheMB() {
		super();
		telefone = new Telefone();
	}

	public FuncionarioDetalheMB(FuncionarioFacade funcionarioFacade) {
		this();
		this.funcionarioFacade = funcionarioFacade;
	}

	public String salvar() {
		String retorno = "";
		try {
			switch (operacao) {
			case INCLUIR:
				funcionarioFacade.incluir(getFuncionario());
				break;

			case ALTERAR:
				incluirDataAtualizacao();
				funcionarioFacade.alterar(getFuncionario());
				break;

			default:
				break;
			}
			limpar();
			retorno = RETORNO_PAGINA;

		} catch (Exception e) {
			FACES.setErrorMessage(e);
		}

		return retorno;
	}

	public String sair() {
		limpar();
		return RETORNO_PAGINA;
	}

	public void incluirDataAtualizacao() {
		funcionario.getDadosCadastro().setDataAtualizacao(new Date());
	}

	public void close(CloseEvent event) {
		telefone = new Telefone();
		FACES.limparCampos(event.getComponent());
	}

	public boolean isConsultando() {
		return getOperacao() == Operacao.CONSULTAR;
	}

	public boolean isIncluindo() {
		return getOperacao() == Operacao.INCLUIR;
	}

	public void limpar() {
		setFuncionario(null);
		setListaCargo(null);
		setTelefone(null);
		funcionarioFacade = null;
	}

	public Funcionario getFuncionario() {
		return funcionario;
	}

	public void setFuncionario(Funcionario funcionario) {
		this.funcionario = funcionario;
	}

	public Operacao getOperacao() {
		return operacao;
	}

	public void setOperacao(Operacao operacao) {
		this.operacao = operacao;
	}

	public Telefone getTelefone() {
		return telefone;
	}

	public void setTelefone(Telefone telefone) {
		this.telefone = telefone;
	}

	public boolean isPossuiMedico() {
		return possuiMedico;
	}

	public void setPossuiMedico(boolean possuiMedico) {
		this.possuiMedico = possuiMedico;
	}

	public List<SelectItem> getListaTipoTel() {
		return CommomUtils.EnumToListSelectItem(TipoTelefone.class);
	}

	public List<SelectItem> getListaSexo() {
		return CommomUtils.EnumToListSelectItem(Sexo.class);
	}

	public List<SelectItem> getListaEstado() {
		return CommomUtils.EnumToListSelectItem(UnidadeFederativa.class);
	}

	public List<SelectItem> getListaEscolaridade() {
		return CommomUtils.EnumToListSelectItem(GrauEscolaridade.class);
	}

	public List<SelectItem> getListaEstadoCivil() {
		return CommomUtils.EnumToListSelectItem(EstadoCivil.class);
	}

	public List<SelectItem> getListaEspecialidade() {
		return CommomUtils.EnumToListSelectItem(Especialidade.class);
	}

	public List<SelectItem> getListaSituacao() {
		return CommomUtils.EnumToListSelectItem(Situacao.class);
	}

	public List<SelectItem> getListaDeficiencia() {
		return CommomUtils.EnumToListSelectItem(TipoDeficiencia.class);
	}

	public List<Cargo> getListaCargo() {
		return listaCargo;
	}

	public void setListaCargo(List<Cargo> listaCargo) {
		this.listaCargo = listaCargo;
	}

	public void incluirTel(ActionEvent event) {
		if (!getFuncionario().getDadosCadastro().getTelefones()
				.contains(telefone)) {
			telefone.setDados(funcionario.getDadosCadastro());
			getFuncionario().getDadosCadastro().getTelefones()
					.add(getTelefone());

		} else {
			telefone.setDados(getFuncionario().getDadosCadastro());
			int index = getFuncionario().getDadosCadastro().getTelefones()
					.indexOf(telefone);
			getFuncionario().getDadosCadastro().getTelefones()
					.set(index, telefone);
		}
		telefone = new Telefone();
	}

	public void excluirTel(ActionEvent event) {
		getFuncionario().getDadosCadastro().getTelefones()
				.remove(getTelefone());
	}

	public void verificaPossuiMedico(AjaxBehaviorEvent event) {
		setPossuiMedico(false);
		if (getFuncionario().getCargo().getTipoFuncionario() == TipoFuncionario.MEDICO) {
			setPossuiMedico(true);
		}

	}

}
